import os,datetime,time,re
import MySQLdb,django
import threading,subprocess

def test_ping(wangduan,list_ip_i,res_ip):
    print(threading.current_thread().getName(),'开始工作')
    ip = str(wangduan) + str(list_ip_i)
    ip_wangduan = str(wangduan)

    #过滤模块  过滤一些不需要PING的IP fullmatch匹配所有 更新
    if re.fullmatch(str(list_ip_i),res_ip) != None:
        print("发现需要过滤的IP,隔离")
        ip_tong = '排除的IP'
        n = 0 #设置为O 归为在线
    else:
        print("没发现有需要过滤的IP")
        #如果返回的数值是0 则为ping通 
        #n = os.system("ping %s -c 1" % ip)  165s
        #subprocess call 不可直接使用空格 需要使用列表的方式传入 100s
        n = subprocess.call(['ping',ip,'-c','1'])
        print(n)
        if n == 0:
            ip_tong = '在线'



    #网关判断模块 5-126 是 1   133-254 是 129
    if list_ip_i >=1 and list_ip_i <= 126:
        print('网关为 1 ')
        ip_wangguan = '1-小段'
    elif list_ip_i >=133 and list_ip_i <=254:
        print('网关为 129')
        ip_wangguan = '129-大段'



    
    #写出TXT 最终版为写入数据库
    # with open("3.txt","a") as f:
    #     if n == 0:
    #         f.write(ip + "在线" + ip_time + "\n")
    #     else:
    #         f.write(ip + "离线" + ip_time + "\n")
    ip_time = datetime.datetime.now()


    #要先写入数据库后 在去读取 不然是上次的数据
    #获取 目前时间 然后减去 在线时间 = 在线时长 
    ip_out_sql = 'select timestampdiff(MINUTE,(select ip_time from ping_test_app_ping_test_db where ip = "%s"),now())' % ip
    cursor.execute(ip_out_sql)
    #获取执行SQL获取到的数据
    update_ping_out_time = cursor.fetchall()[0][0]
    print(update_ping_out_time,"mmmmmmmmmmmmmmmmm",ip_time)

    #字段不允许提交空字符，第一次是空的 所有才做了一个判断 待优化
    if update_ping_out_time == None:
        update_ping_out_time = 1        
    
    if n == 0:
        update_ping_out_time = 0
        #如有则删再新增，没有就新增
        #test_ip 为存放的数据库表 如改动需更改MySQL对应设置
        sql = 'replace into ping_test_app_ping_test_db values("%s","%s","%s","%s",%s,"%s")' % (ip,ip_wangguan,ip_time,ip_tong,update_ping_out_time,ip_wangduan)
        
    else:
        ip_tong = "离线"
        #select ip_tong from test_ip where ip = "192.168.1.1"            


        #如果数据存在则更新中一条字段，不存在则新增
        sql = 'insert into ping_test_app_ping_test_db values("%s","%s","%s","%s",%s,"%s") on duplicate key update ip_tong = "离线",update_ping_out_time = %s' % (ip,ip_wangguan,ip_time,ip_tong,update_ping_out_time,ip_wangduan,update_ping_out_time)


    try:
        # 执行sql语句
        cursor.execute(sql)
        # 执行多条SQL语句
        #cursor.executemany(sql)
        # 提交到数据库执行
        db.commit()
        print("已提交")
        
    except:
        # Rollback in case there is any error
        print("提交失败")
        db.rollback()


    
    # try:
        
    #     db.commit()
    #     print("更新离线时间成功")
    # except :
    #     db.rollback()
    #     print("更新离线时间失败")

    #写出HTML 
    # ip_html = open("/Users/crz/crz log/ping/ping.html","a")
    # ip_html_txt = ip + str(ip_time) + str(ip_tong) + "\n"
    # ip_html.write(ip_html_txt)
    # ip_html.close()z

def test(i):
    print(i)
    print(threading.current_thread().getName(),"线程启动")
    sql_wangduan = 'select * from ping_test_ping_db_wangduan'
    cursor.execute(sql_wangduan)
    #print(cursor.fetchall())
    for sql_i in cursor.fetchall():
        print(sql_i)
        print(sql_i[0],'mmmmmmmm',sql_i[1])
    print("结束")

if __name__ == "__main__":
    print(time.strftime('%H:%M'))
    #开启死循环
    # while True:
    #     #登录数据库
    #     start_time = time.time()
    #     db = MySQLdb.connect("47.93.53.27","root","741852aa","ping_test_db",charset="utf8")    
    #     cursor = db.cursor()
    #     #读取本地网段文件列表  开启多线程 threading
    #     #ip_list_wangduan = open("/Users/crz/crz log/ping/1.txt","r")
    #     #no_ip_list = open('/Users/crz/crz log/ping/no.txt','r'
    #     cursor.execute('select * from ping_test_app_ping_test_wangduan_db')
    #     #res_ip = no_ip_list.read()# 读取需要过滤的IP列表
    #     #这样写可以 去掉TXT文件中的 换行符 \n
    #     #for list_ip in ip_list_wangduan.read().splitlines():
    #     for list_ip in cursor.fetchall():
    #         print(list_ip,'获取到的IP段是这个')
    #         for list_ip_i in range(1,255):
    #             #list_ip_t = threading.Thread(target=test_ping,args=(list_ip[0],list_ip_i,res_ip))
    #             list_ip_t = threading.Thread(target=test_ping,args=(list_ip[0],list_ip_i,list_ip[1]))
    #             #list_ip_t = threading.Thread(target=test,args=(list_ip,))    
    #             list_ip_t.start()
    #             #别问我为啥要延时0.5秒，我也不知道 不延时会报错
    #             time.sleep(3)#60s  17.55s 原本2400s #貌似与线程有关，线程越多延时需更长
    #     #操作完成  关闭数据库与网段txt文件
    #     list_ip_t.join()
    #     #ip_list_wangduan.close()
    #     #no_ip_list.close()
    #     stop_time = time.time() - start_time
    #     print("进程结束，等待5分钟。。。。。","耗时",stop_time)
    #     time.sleep(60*10)
    #     db.close()#需要延时关闭数据库，防止提前关闭导致线程错误